SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [dbo].[LIQEstimuloPorAgentes] 
@Mes INT, 
@Anio INT, 
@Borrar BIT,
@CabeceraDeLiquidacion INT,
@SituacionRevistaAnalizar INT, 
@FechaDesdeAnalizar DATETIME,
@FechaHastaAnalizar DATETIME
AS

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- REGISTRO DE ACTUALIZACIONES
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
-- 18/03/2008 - REVISAR para incluir concepto 44 Acuerdo Paritaria 19/08 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET NOCOUNT ON
SET DATEFORMAT DMY 

DECLARE @IdAgente INT
DECLARE @CargoSalarial INT
DECLARE @Horas INT
DECLARE @Porcentaje INT

DECLARE @Estimulo DECIMAL(18,4)
DECLARE @MontoEstimulo DECIMAL(18,4)
DECLARE @TotalEstimulo DECIMAL(18,4)	

DECLARE @Estimulo2 DECIMAL(18,4)
DECLARE @MontoEstimulo2 DECIMAL(18,4)
DECLARE @TotalEstimulo2 DECIMAL(18,4)

DECLARE @Acuerdo DECIMAL(18,4)
DECLARE @MontoAcuerdo DECIMAL(18,4)
DECLARE @TotalAcuerdo DECIMAL(18,4)

DECLARE @TotalEstimuloEstado DECIMAL(18,4)
DECLARE @TotalEstimuloEstado2 DECIMAL(18,4)
DECLARE @TotalAcuerdoEstado DECIMAL(18,4)

DECLARE @SaldoEstimulo DECIMAL(18,4)
DECLARE @SaldoEstimulo2 DECIMAL(18,4)
DECLARE @SaldoAcuerdo DECIMAL(18,4)


DECLARE @NroError INT
DECLARE @SituacionRevista INT


SELECT @MontoEstimulo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ValorEstimuloLey2088', @FechaHastaAnalizar))
SELECT @MontoEstimulo2 = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ValorEstimuloDecreto806', @FechaHastaAnalizar))
SELECT @MontoAcuerdo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ImporteAcuerdoParitaria19/08', @FechaHastaAnalizar))

SELECT @TotalEstimulo = 0, @Estimulo = 0, @Porcentaje = 0

SELECT @TotalEstimulo2 = 0, @Estimulo2 = 0

SELECT @TotalAcuerdo = 0, @Acuerdo = 0

SELECT @TotalEstimuloEstado = 0, @TotalEstimuloEstado2 = 0, @TotalAcuerdoEstado = 0 

SELECT @SaldoEstimulo = 0, @SaldoEstimulo2 = 0, @SaldoAcuerdo = 0 

-- Se borrar todos los registro si se indica con parametro 1
IF @Borrar = 1
BEGIN
    DELETE FROM tb_MontosDeConceptosDelAgente WHERE Anio = @Anio AND Mes = @Mes
    DELETE FROM tb_EstimuloDeAgentes WHERE Anio = @Anio AND Mes = @Mes
END

SET DATEFORMAT DMY

-- Cursor con Agentes en Organizaciones Privadas
-------------------------------------------------------------------------------------  ESTO COMO JUEGA - 06/12/05 -------------------------------------------------------------------------
--  QUE PASA CON LOS SERVICIOS/SUBSERVICIOS QUE ESTAN DADOS DE BAJA EN EL PERIODO QUE SE ESTA LIQUIDANDO

DECLARE Agentes CURSOR FOR

	SELECT DISTINCT IdAgente FROM Tb_Agentes
		WHERE EXISTS (SELECT * FROM tb_ServiciosAgentes S
			INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
			INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
				WHERE idAgente = S.Agente
		             	   		AND EsPrivada = 'S'
					AND ( SS.FechaAlta<= @FechaHastaAnalizar AND ( SS.FechaBaja is null OR SS.FechaBaja >= @FechaDesdeAnalizar ))
					AND ((@SituacionRevistaAnalizar IS NULL AND S.SituacionRevista <>4) 
					   OR (@SituacionRevistaAnalizar IS NOT NULL 
					     AND NOT EXISTS (SELECT * FROM Tb_ServiciosAgentes SACns 
						INNER JOIN tb_Organizaciones OrgCns ON OrgCns.idOrganizaciones = SACns.UbicacionOrig -- Agregado 01-08-07
						WHERE SACns.Agente=idAgente 
						   AND OrgCns.EsPrivada = 'S'   -- Agregado 01-08-07
						   AND (SACNs.FEchaAlta <=@FechaHastaAnalizar AND  (SACns.FechaBaja IS NULL OR SACns.FechaBaja >= @FechaDesdeAnalizar ) )
						   AND SACns.SituacionRevista<>@SituacionRevistaAnalizar))))

   

OPEN Agentes

FETCH NEXT FROM Agentes Into @IdAgente

WHILE @@Fetch_Status = 0
BEGIN

--Si el agente esta además en una organización pública
IF @idAgente In 
	(SELECT DISTINCT Agente FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
	INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
	WHERE (EsPrivada Is Null Or EsPrivada = 'N')
	AND (S.FechaAlta<= @FechaHastaAnalizar AND (S.FechaBaja is null OR S.FechaBaja >= @FechaDesdeAnalizar)))
--	AND ( (S.FechaBaja is null) OR (S.FechaBaja IS NOT NULL AND S.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar)))
BEGIN
	-- Cursor con TODOS los servicios publicos del Agente
	DECLARE Servicios CURSOR FOR
	SELECT CargoSalarial, Horas, SituacionRevista FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = idServicioAgente
	INNER JOIN tb_Organizaciones ON IdOrganizaciones = UbicacionOrig
	WHERE (EsPrivada IS NULL OR EsPrivada = 'N')   
	AND ((Licencia Is Null) Or (Licencia Is Not Null AND Licencia Not In (16,17,18,30,46) ))
	AND SS.FechaAlta = (SELECT MAX(FechaAlta) FROM tb_SubServiciosAgentes WHERE ServicioAgente = idServicioAgente)
	AND ( (SS.FechaBaja is null) OR (SS.FechaBaja >= @FechaDesdeAnalizar))	--AGREGADO
--	AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar))	--AGREGADO

	AND Agente = @IdAgente
	AND SS.SituacionLaboral <> 1
	OPEN Servicios

	FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista
	
	WHILE @@FETCH_STATUS  = 0 
	BEGIN		
		--Se extrae el % de Estímulo del cargo que tiene el servicio
		SELECT @Porcentaje = Porcentaje FROM tb_PorcentajesDeEstimulo WHERE IdCargo = @CargoSalarial
		
		--Si el cargo no tiene especificado un porcentaje -> 100%
		If @Porcentaje Is Null
		BEGIN
			SELECT @Estimulo = @MontoEstimulo
			SELECT @Estimulo2 = @MontoEstimulo2
			SELECT @Acuerdo = @MontoAcuerdo
		END
		ELSE -- Se saca el estimulo en funcion del porcentaje
		BEGIN
			SELECT @Estimulo = (@MontoEstimulo * @Porcentaje) / 100
			SELECT @Estimulo2 = (@MontoEstimulo2 * @Porcentaje) / 100
			SELECT @Acuerdo = (@MontoAcuerdo * @Porcentaje) / 100
		END

		-- Si el cargo es HORAS EGB o POLIMODAL
		IF @CargoSalarial In (2901, 3001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 15
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 15
			SELECT @Acuerdo = (@Horas * @MontoAcuerdo) / 15
		END

		-- Si el cargo es HORAS TERCIARIAS
		IF @CargoSalarial In (4001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 12	
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 12
			SELECT @Acuerdo = (@Horas * @MontoAcuerdo) / 12
		END

		--Se acumulan los totales para cada estimulo
		SELECT @TotalEstimulo = @TotalEstimulo + @Estimulo
		SELECT @TotalEstimulo2 = @TotalEstimulo2 + @Estimulo2
		SELECT @TotalAcuerdo = @TotalAcuerdo + @Acuerdo
				
		SELECT @Estimulo = 0, @Estimulo2 = 0, @Acuerdo = 0

		SELECT @Porcentaje = NULL

		FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista

	END

	IF @TotalEstimulo IS NULL 
	BEGIN
		SELECT @TotalEstimulo = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @SituacionRevistaAnalizar IS NOT NULL
		DELETE FROM tb_EstimuloDeAgentes WHERE Agente = @idAgente AND Mes = @Mes AND Anio = @Anio

	INSERT INTO tb_EstimuloDeAgentes SELECT @idAgente, @TotalEstimulo, 33, @Mes, @Anio

	SELECT @NroError = @@ERROR
	IF @NroError <> 0
	  BEGIN 
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	  END

	IF @TotalEstimulo2 IS NULL
	BEGIN 
		SELECT @TotalEstimulo2 = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 36, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	END

	INSERT INTO tb_EstimuloDeAgentes SELECT @idAgente, @TotalEstimulo2, 36, @Mes, @Anio

	SELECT @NroError = @@ERROR
	IF @NroError <> 0
	  BEGIN 
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 36, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	  END

	IF @TotalAcuerdo IS NULL
	BEGIN 
		SELECT @TotalAcuerdo = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 44, 'Error al Cargar Acuerdo Paritara 19/08 para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	END

	INSERT INTO tb_EstimuloDeAgentes SELECT @idAgente, @TotalAcuerdo, 44, @Mes, @Anio

	SELECT @NroError = @@ERROR
	IF @NroError <> 0
	  BEGIN 
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 44, 'Error al Cargar Acuerdo Paritaria 19/08 para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	  END

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0, @TotalAcuerdo = 0
		
	CLOSE Servicios
	DEALLOCATE Servicios
	END	
	FETCH NEXT FROM Agentes INTO @IdAgente
END

CLOSE Agentes
DEALLOCATE Agentes

--------------------------------------------------------------------------
-- PARA CALCULAR LAS PARTES PRIVADAS
--------------------------------------------------------------------------

SELECT @TotalEstimulo = 0, @Estimulo = 0, @Porcentaje = 0
SELECT @TotalEstimulo2 = 0, @Estimulo2 = 0
SELECT @TotalAcuerdo = 0, @Acuerdo = 0 

-- Cursor con Agentes en Organizaciones Privadas
--  QUE PASA CON LOS SERVICIOS/SUBSERVICIOS QUE ESTAN DADOS DE BAJA EN EL PERIODO QUE SE ESTA LIQUIDANDO
DECLARE Agentes CURSOR For

--CAMBIADO EL 7/3/2006 porque liquidaba mal los estimulos de los suplentes
SELECT DISTINCT IdAgente FROM Tb_Agentes
		WHERE EXISTS (SELECT * FROM tb_ServiciosAgentes S
			INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
			INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
				WHERE idAgente = S.Agente
		             	   		AND EsPrivada = 'S'
					AND ( SS.FechaAlta<= @FechaHastaAnalizar AND ( SS.FechaBaja is null OR SS.FechaBaja >= @FechaDesdeAnalizar ))
					AND ((@SituacionRevistaAnalizar IS NULL AND S.SituacionRevista <>4) 
					   OR (@SituacionRevistaAnalizar IS NOT NULL 
					     AND NOT EXISTS (SELECT * FROM Tb_ServiciosAgentes SACns 
						INNER JOIN tb_Organizaciones OrgCns ON OrgCns.idOrganizaciones = SACns.UbicacionOrig -- Agregado 01-08-07
						WHERE SACns.Agente=idAgente 
						   AND OrgCns.EsPrivada = 'S'   -- Agregado 01-08-07
						   AND (SACNs.FEchaAlta <=@FechaHastaAnalizar AND  (SACns.FechaBaja IS NULL OR SACns.FechaBaja >= @FechaDesdeAnalizar ) )
						   AND SACns.SituacionRevista<>@SituacionRevistaAnalizar))))


OPEN Agentes

FETCH NEXT FROM Agentes Into @IdAgente

WHILE @@Fetch_Status = 0
BEGIN

	-- Cursor con TODOS los servicios privados del Agente
	DECLARE Servicios CURSOR FOR
	SELECT CargoSalarial, Horas, SituacionRevista FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = idServicioAgente
	INNER JOIN tb_Organizaciones ON IdOrganizaciones = UbicacionOrig
	WHERE (EsPrivada = 'S')   
	AND ((Licencia Is Null) Or (Licencia Is Not Null AND Licencia Not In (16,17,18,30,46) ))
	AND SS.FechaAlta = (SELECT MAX(FechaAlta) FROM tb_SubServiciosAgentes WHERE ServicioAgente = idServicioAgente)
	--AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar))	--AGREGADO
	AND ( (SS.FechaBaja is null) OR 	(SS.FechaBaja >= @FechaDesdeAnalizar))
	AND Agente = @IdAgente
	AND SS.SituacionLaboral <> 1
	OPEN Servicios

	FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista
	
	WHILE @@Fetch_Status = 0 
	BEGIN
		--Se extrae el % de Estímulo del cargo que tiene el servicio
		SELECT @Porcentaje = Porcentaje FROM tb_PorcentajesDeEstimulo WHERE IdCargo = @CargoSalarial
		
		If @Porcentaje IS NULL
		BEGIN
			SELECT @Estimulo = @MontoEstimulo
			SELECT @Estimulo2 = @MontoEstimulo2
			SELECT @Acuerdo = @MontoAcuerdo
		END
		ELSE
		BEGIN
			SELECT @Estimulo = (@MontoEstimulo * @Porcentaje) / 100
			SELECT @Estimulo2 = (@MontoEstimulo2 * @Porcentaje) / 100
			SELECT @Acuerdo = (@MontoAcuerdo * @Porcentaje) / 100
		END

		-- Si el cargo es HORAS EGB o POLIMODAL
		IF @CargoSalarial In (2901, 3001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 15
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 15
			SELECT @Acuerdo = (@Horas * @MontoAcuerdo) / 15
		END

		-- Si el cargo es HORAS TERCIARIAS
		IF @CargoSalarial In (4001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 12	
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 12
			SELECT @Acuerdo = (@Horas * @MontoAcuerdo) / 12
		END

		SELECT @TotalEstimulo = @TotalEstimulo + @Estimulo
		SELECT @TotalEstimulo2 = @TotalEstimulo2 + @Estimulo2
		SELECT @TotalAcuerdo = @TotalAcuerdo + @Acuerdo
		
				
		SELECT @Estimulo = 0, @Estimulo2 = 0, @Acuerdo = 0 

		SELECT @Porcentaje = NULL

		FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista

	END

	--Se extraen los importes de estimulo del agente cobrado en el estado
	SELECT @TotalEstimuloEstado = ISNULL(Monto,0) FROM tb_EstimuloDeAgentes WHERE Agente = @IdAgente AND Concepto = 33 AND Anio = @Anio AND Mes = @Mes
	SELECT @TotalEstimuloEstado2 = ISNULL(Monto,0) FROM tb_EstimuloDeAgentes WHERE Agente = @IdAgente AND Concepto = 36 AND Anio = @Anio AND Mes = @Mes
	SELECT @TotalAcuerdoEstado = ISNULL(Monto,0) FROM tb_EstimuloDeAgentes WHERE Agente = @IdAgente AND Concepto = 44 AND Anio = @Anio AND Mes = @Mes
	 
	--Si se supera el monto del estimulo en el estado se le asigna el Tope a cada uno
	IF @TotalEstimuloEstado > @MontoEstimulo
			SELECT @TotalEstimuloEstado = @MontoEstimulo
	IF @TotalEstimuloEstado2 > @MontoEstimulo2
		SELECT @TotalEstimuloEstado2 = @MontoEstimulo2
	IF @TotalAcuerdoEstado > @MontoAcuerdo
		SELECT @TotalAcuerdoEstado = @MontoAcuerdo
	
	--Si se supera el monto del estimulo en lo privado se le asigna el Tope a cada uno
	IF @TotalEstimulo > @MontoEstimulo
		SELECT @TotalEstimulo = @MontoEstimulo
	IF @TotalEstimulo2 > @MontoEstimulo2
		SELECT @TotalEstimulo2 = @MontoEstimulo2
	IF @TotalAcuerdo > @MontoAcuerdo
		SELECT @TotalAcuerdo = @MontoAcuerdo

	--Se calculan los saldos disponibles para cobrar en el privado
	SELECT @SaldoEstimulo = @MontoEstimulo - @TotalEstimuloEstado
	SELECT @SaldoEstimulo2 = @MontoEstimulo2 - @TotalEstimuloEstado2
	SELECT @SaldoAcuerdo = @MontoAcuerdo - @TotalAcuerdoEstado

	--En funcion del saldo se asigna el estimulo a cobrar en lo privado
	IF @TotalEstimulo > @SaldoEstimulo
		SELECT @TotalEstimulo = @SaldoEstimulo
	IF @TotalEstimulo2 > @SaldoEstimulo2
		SELECT @TotalEstimulo2 = @SaldoEstimulo2	IF @TotalAcuerdo > @SaldoAcuerdo
		SELECT @TotalAcuerdo = @SaldoAcuerdo

	IF @TotalEstimulo IS NULL 
	BEGIN
		SELECT @TotalEstimulo = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @TotalEstimulo2 IS NULL 
	BEGIN
		SELECT @TotalEstimulo2 = 0
		INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 36, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @TotalAcuerdo IS NULL 
	BEGIN
		SELECT @TotalAcuerdo = 0
		INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 44, 'Error al Cargar Acuerdo Paritaria 19/08 para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END


	IF @SituacionRevistaAnalizar IS NOT NULL
		DELETE FROM tb_MontosDeConceptosDelAgente WHERE Agente = @idAgente AND Mes = @Mes AND Anio = @Anio

	INSERT INTO tb_MontosDeConceptosDelAgente SELECT @idAgente, @TotalEstimulo, GETDATE(), 33, @Mes, @Anio
	INSERT INTO tb_MontosDeConceptosDelAgente SELECT @idAgente, @TotalEstimulo2, GETDATE(), 36, @Mes, @Anio
	INSERT INTO tb_MontosDeConceptosDelAgente SELECT @idAgente, @TotalAcuerdo, GETDATE(), 44, @Mes, @Anio

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0, @TotalEstimuloEstado=0, @TotalEstimuloEstado2 = 0, @SaldoEstimulo = 0, @SaldoEstimulo2 = 0
	SELECT @TotalAcuerdo = 0, @TotalAcuerdoEstado = 0, @SaldoAcuerdo = 0 
	
	CLOSE Servicios
	DEALLOCATE Servicios
	
	FETCH NEXT FROM Agentes INTO @IdAgente

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0, @TotalEstimuloEstado=0, @TotalEstimuloEstado2 = 0, @SaldoEstimulo = 0, @SaldoEstimulo2 = 0
	SELECT @TotalAcuerdo = 0, @TotalAcuerdoEstado = 0, @SaldoAcuerdo = 0 
END

CLOSE Agentes
DEALLOCATE Agentes


/*


CREATE PROCEDURE LIQEstimuloPorAgentes 
@Mes INT, 
@Anio INT, 
@Borrar BIT,
@CabeceraDeLiquidacion INT,
@SituacionRevistaAnalizar INT, 
@FechaDesdeAnalizar DATETIME,
@FechaHastaAnalizar DATETIME
AS

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- REGISTRO DE ACTUALIZACIONES
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

DECLARE @IdAgente INT, @Estimulo DECIMAL(18,4), @CargoSalarial INT, @Horas INT, @Porcentaje INT, @MontoEstimulo DECIMAL(18,4), @TotalEstimulo DECIMAL(18,4)	
DECLARE @MontoEstimulo2 DECIMAL(18,4)
DECLARE @Estimulo2 DECIMAL(18,4)
DECLARE @TotalEstimulo2 DECIMAL(18,4)
DECLARE @TotalEstimuloEstado DECIMAL(18,4), @TotalEstimuloEstado2 DECIMAL(18,4)
DECLARE @SaldoEstimulo DECIMAL(18,4), @SaldoEstimulo2 DECIMAL(18,4)
DECLARE @NroError INT
DECLARE @SituacionRevista INT

--SELECT @MontoEstimulo = CONVERT(DECIMAL(18,4),Valor1) FROM tb_Parametros WHERE Parametro = 'ValorEstimuloLey2088'
--SELECT @MontoEstimulo2 = CONVERT(DECIMAL(18,4),Valor1) FROM tb_Parametros WHERE Parametro = 'ValorEstimuloDecreto806'

SELECT @MontoEstimulo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ValorEstimuloLey2088', @FechaHastaAnalizar))
SELECT @MontoEstimulo2 = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('ValorEstimuloDecreto806', @FechaHastaAnalizar))

SELECT @TotalEstimulo = 0, @Estimulo = 0, @Porcentaje = 0
SELECT @TotalEstimulo2 = 0, @Estimulo2 = 0
SELECT @TotalEstimuloEstado = 0, @TotalEstimuloEstado2 = 0
SELECT @SaldoEstimulo = 0, @SaldoEstimulo2 = 0

-- Se borrar todos los registro si se indica con parametro 1
IF @Borrar = 1
BEGIN
    DELETE FROM tb_MontosDeConceptosDelAgente WHERE Anio = @Anio AND Mes = @Mes
    DELETE FROM tb_EstimuloDeAgentes WHERE Anio = @Anio AND Mes = @Mes
END

SET DATEFORMAT DMY

-- Cursor con Agentes en Organizaciones Privadas
-------------------------------------------------------------------------------------  ESTO COMO JUEGA - 06/12/05 -------------------------------------------------------------------------
--  QUE PASA CON LOS SERVICIOS/SUBSERVICIOS QUE ESTAN DADOS DE BAJA EN EL PERIODO QUE SE ESTA LIQUIDANDO

DECLARE Agentes CURSOR FOR

--- SOLO MIRE ESTE, HAY ALGO MAL EN LAS FECHAS DEL NOT EXISTS EN SACns pero no me doy cuenta que

	SELECT DISTINCT IdAgente FROM Tb_Agentes
		WHERE EXISTS (SELECT * FROM tb_ServiciosAgentes S
			INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
			INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
				WHERE idAgente = S.Agente
		             	   		AND EsPrivada = 'S'
					AND ( SS.FechaAlta<= @FechaHastaAnalizar AND ( SS.FechaBaja is null OR SS.FechaBaja >= @FechaDesdeAnalizar ))
					AND ((@SituacionRevistaAnalizar IS NULL AND S.SituacionRevista <>4) 
					   OR (@SituacionRevistaAnalizar IS NOT NULL 
					     AND NOT EXISTS (SELECT * FROM Tb_ServiciosAgentes SACns 
						WHERE SACns.Agente=idAgente 
						   AND (SACNs.FEchaAlta <=@FechaHastaAnalizar AND  (SACns.FechaBaja IS NULL OR SACns.FechaBaja >= @FechaDesdeAnalizar ) )
						   AND SACns.SituacionRevista<>@SituacionRevistaAnalizar))))

					-- Cambio en las Fechas tomo las que envio como parametros 	
					--AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @Desde AND @Hasta)))	

OPEN Agentes

FETCH NEXT FROM Agentes Into @IdAgente

WHILE @@Fetch_Status = 0
BEGIN

--Si el agente esta además en una organización pública
IF @idAgente In 
	(SELECT DISTINCT Agente FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
	INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
	WHERE (EsPrivada Is Null Or EsPrivada = 'N')
	AND (S.FechaAlta<= @FechaHastaAnalizar AND (S.FechaBaja is null OR S.FechaBaja >= @FechaDesdeAnalizar)))
--	AND ( (S.FechaBaja is null) OR (S.FechaBaja IS NOT NULL AND S.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar)))
BEGIN
	-- Cursor con TODOS los servicios publicos del Agente
	DECLARE Servicios CURSOR FOR
	SELECT CargoSalarial, Horas, SituacionRevista FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = idServicioAgente
	INNER JOIN tb_Organizaciones ON IdOrganizaciones = UbicacionOrig
	WHERE (EsPrivada IS NULL OR EsPrivada = 'N')   
	AND ((Licencia Is Null) Or (Licencia Is Not Null AND Licencia Not In (16,17,18,30,46) ))
	AND SS.FechaAlta = (SELECT MAX(FechaAlta) FROM tb_SubServiciosAgentes WHERE ServicioAgente = idServicioAgente)
	AND ( (SS.FechaBaja is null) OR (SS.FechaBaja >= @FechaDesdeAnalizar))	--AGREGADO
--	AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar))	--AGREGADO

	AND Agente = @IdAgente
	AND SS.SituacionLaboral <> 1
	OPEN Servicios

	FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista
	
	WHILE @@FETCH_STATUS  = 0 
	BEGIN		
		--Se extrae el % de Estímulo del cargo que tiene el servicio
		SELECT @Porcentaje = Porcentaje FROM tb_PorcentajesDeEstimulo WHERE IdCargo = @CargoSalarial
		
		--Si el cargo no tiene especificado un porcentaje -> 100%
		If @Porcentaje Is Null
		BEGIN
			SELECT @Estimulo = @MontoEstimulo
			SELECT @Estimulo2 = @MontoEstimulo2
		END
		ELSE -- Se saca el estimulo en funcion del porcentaje
		BEGIN
			SELECT @Estimulo = (@MontoEstimulo * @Porcentaje) / 100
			SELECT @Estimulo2 = (@MontoEstimulo2 * @Porcentaje) / 100
		END

		-- Si el cargo es HORAS EGB o POLIMODAL
		IF @CargoSalarial In (2901, 3001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 15
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 15
		END

		-- Si el cargo es HORAS TERCIARIAS
		IF @CargoSalarial In (4001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 12	
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 12
		END

		--Se acumulan los totales para cada estimulo
		SELECT @TotalEstimulo = @TotalEstimulo + @Estimulo
		SELECT @TotalEstimulo2 = @TotalEstimulo2 + @Estimulo2
				
		SELECT @Estimulo = 0, @Estimulo2 = 0

		SELECT @Porcentaje = NULL

		FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista

	END

	IF @TotalEstimulo IS NULL 
	BEGIN
		SELECT @TotalEstimulo = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @SituacionRevistaAnalizar IS NOT NULL
		DELETE FROM tb_EstimuloDeAgentes WHERE Agente = @idAgente AND Mes = @Mes AND Anio = @Anio

	INSERT INTO tb_EstimuloDeAgentes SELECT @idAgente, @TotalEstimulo, 33, @Mes, @Anio

	SELECT @NroError = @@ERROR
	IF @NroError <> 0
	  BEGIN 
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	  END

	IF @TotalEstimulo2 IS NULL
	BEGIN 
		SELECT @TotalEstimulo2 = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	END

	INSERT INTO tb_EstimuloDeAgentes SELECT @idAgente, @TotalEstimulo2, 36, @Mes, @Anio

	SELECT @NroError = @@ERROR
	IF @NroError <> 0
	  BEGIN 
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 36, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, @NroError)
	  END

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0
		
	CLOSE Servicios
	DEALLOCATE Servicios
	END	
	FETCH NEXT FROM Agentes INTO @IdAgente
END

CLOSE Agentes
DEALLOCATE Agentes

--------------------------------------------------------------------------
-- PARA CALCULAR LAS PARTES PRIVADAS
--------------------------------------------------------------------------

SELECT @TotalEstimulo = 0, @Estimulo = 0, @Porcentaje = 0
SELECT @TotalEstimulo2 = 0, @Estimulo2 = 0

-- Cursor con Agentes en Organizaciones Privadas
--  QUE PASA CON LOS SERVICIOS/SUBSERVICIOS QUE ESTAN DADOS DE BAJA EN EL PERIODO QUE SE ESTA LIQUIDANDO
DECLARE Agentes CURSOR For


-- SELECT DISTINCT IdAgente FROM tb_Agentes
-- WHERE EXISTS (SELECT * FROM tb_ServiciosAgentes S
--	INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
--	INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
--	WHERE idAgente = Agente
--	AND EsPrivada = 'S'
--	AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar))
--	AND ((@SituacionRevistaAnalizar IS NULL) 
--	   OR (@SituacionRevistaAnalizar IS NOT NULL 
--	     AND NOT EXISTS (SELECT * FROM Tb_ServiciosAgentes SACns 
--	    			WHERE SACns.Agente=idAgente 
--				   AND ((SACns.FechaBaja IS NULL) OR (SACns.FechaBaja IS NOT NULL AND SACns.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar) )
--				   AND SACns.SituacionRevista<>@SituacionRevistaAnalizar))))

--CAMBIADO EL 7/3/2006 porque liquidaba mal los estimulos de los suplentes
SELECT DISTINCT IdAgente FROM Tb_Agentes
		WHERE EXISTS (SELECT * FROM tb_ServiciosAgentes S
			INNER JOIN tb_SubServiciosAgentes SS On ServicioAgente = idServicioAgente 
			INNER JOIN tb_Organizaciones On idOrganizaciones = UbicacionOrig	
				WHERE idAgente = S.Agente
		             	   		AND EsPrivada = 'S'
					AND ( SS.FechaAlta<= @FechaHastaAnalizar AND ( SS.FechaBaja is null OR SS.FechaBaja >= @FechaDesdeAnalizar ))
					AND ((@SituacionRevistaAnalizar IS NULL AND S.SituacionRevista <>4) 
					   OR (@SituacionRevistaAnalizar IS NOT NULL 
					     AND NOT EXISTS (SELECT * FROM Tb_ServiciosAgentes SACns 
						WHERE SACns.Agente=idAgente 
						   AND (SACNs.FEchaAlta <=@FechaHastaAnalizar AND  (SACns.FechaBaja IS NULL OR SACns.FechaBaja >= @FechaDesdeAnalizar ) )
						   AND SACns.SituacionRevista<>@SituacionRevistaAnalizar))))
OPEN Agentes

FETCH NEXT FROM Agentes Into @IdAgente

WHILE @@Fetch_Status = 0
BEGIN

	-- Cursor con TODOS los servicios privados del Agente
	DECLARE Servicios CURSOR FOR
	--SELECT CargoSalarial, Horas FROM tb_ServiciosAgentes S
	--INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = idServicioAgente
	--INNER JOIN tb_Organizaciones ON IdOrganizaciones = UbicacionOrig
	--WHERE EsPrivada = 'S'
	--AND SS.FechaBaja Is Null    -- AGREGADO
	--AND TipoDeServicio = 1 AND ((Licencia Is Null) Or (Licencia Is Not Null AND Licencia Not In (16,17,18,30,46) ))
	--AND SS.FechaAlta = (SELECT Max(FechaAlta) FROM tb_SubServiciosAgentes WHERE ServicioAgente = idServicioAgente)
	--AND Agente = @IdAgente
	SELECT CargoSalarial, Horas, SituacionRevista FROM tb_ServiciosAgentes S
	INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = idServicioAgente
	INNER JOIN tb_Organizaciones ON IdOrganizaciones = UbicacionOrig
	WHERE (EsPrivada = 'S')   
	AND ((Licencia Is Null) Or (Licencia Is Not Null AND Licencia Not In (16,17,18,30,46) ))
	AND SS.FechaAlta = (SELECT MAX(FechaAlta) FROM tb_SubServiciosAgentes WHERE ServicioAgente = idServicioAgente)
--AND ( (SS.FechaBaja is null) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja BETWEEN @FechaDesdeAnalizar AND @FechaHastaAnalizar))	--AGREGADO
	AND ( (SS.FechaBaja is null) OR 	(SS.FechaBaja >= @FechaDesdeAnalizar))
	AND Agente = @IdAgente
	AND SS.SituacionLaboral <> 1
	OPEN Servicios

	FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista
	
	WHILE @@Fetch_Status = 0 
	BEGIN
		--Se extrae el % de Estímulo del cargo que tiene el servicio
		SELECT @Porcentaje = Porcentaje FROM tb_PorcentajesDeEstimulo WHERE IdCargo = @CargoSalarial
		
		If @Porcentaje IS NULL
		BEGIN
			SELECT @Estimulo = @MontoEstimulo
			SELECT @Estimulo2 = @MontoEstimulo2
		END
		ELSE
		BEGIN
			SELECT @Estimulo = (@MontoEstimulo * @Porcentaje) / 100
			SELECT @Estimulo2 = (@MontoEstimulo2 * @Porcentaje) / 100
		END

		-- Si el cargo es HORAS EGB o POLIMODAL
		IF @CargoSalarial In (2901, 3001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 15
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 15
		END

		-- Si el cargo es HORAS TERCIARIAS
		IF @CargoSalarial In (4001)
		BEGIN
			SELECT @Estimulo = (@Horas * @MontoEstimulo) / 12	
			SELECT @Estimulo2 = (@Horas * @MontoEstimulo2) / 12
		END

		SELECT @TotalEstimulo = @TotalEstimulo + @Estimulo
		SELECT @TotalEstimulo2 = @TotalEstimulo2 + @Estimulo2
				
		SELECT @Estimulo = 0, @Estimulo2 = 0

		SELECT @Porcentaje = NULL

		FETCH NEXT FROM Servicios Into @CargoSalarial, @Horas, @SituacionRevista

	END

	--Se extraen los importes de estimulo del agente cobrado en el estado
	SELECT @TotalEstimuloEstado = ISNULL(Monto,0) FROM tb_EstimuloDeAgentes WHERE Agente = @IdAgente AND Concepto = 33 AND Anio = @Anio AND Mes = @Mes
	SELECT @TotalEstimuloEstado2 = ISNULL(Monto,0) FROM tb_EstimuloDeAgentes WHERE Agente = @IdAgente AND Concepto = 36 AND Anio = @Anio AND Mes = @Mes
	 
	--Si se supera el monto del estimulo en el estado se le asigna el Tope a cada uno
	IF @TotalEstimuloEstado > @MontoEstimulo
			SELECT @TotalEstimuloEstado = @MontoEstimulo
	IF @TotalEstimuloEstado2 > @MontoEstimulo2
		SELECT @TotalEstimuloEstado2 = @MontoEstimulo2
	
	--Si se supera el monto del estimulo en lo privado se le asigna el Tope a cada uno
	IF @TotalEstimulo > @MontoEstimulo
		SELECT @TotalEstimulo = @MontoEstimulo
	IF @TotalEstimulo2 > @MontoEstimulo2
		SELECT @TotalEstimulo2 = @MontoEstimulo2

	--Se calculan los saldos disponibles para cobrar en el privado
	SELECT @SaldoEstimulo = @MontoEstimulo - @TotalEstimuloEstado
	SELECT @SaldoEstimulo2 = @MontoEstimulo2 - @TotalEstimuloEstado2

	--En funcion del saldo se asigna el estimulo a cobrar en lo privado
	IF @TotalEstimulo > @SaldoEstimulo
		SELECT @TotalEstimulo = @SaldoEstimulo
	IF @TotalEstimulo2 > @SaldoEstimulo2
		SELECT @TotalEstimulo2 = @SaldoEstimulo2

	IF @TotalEstimulo IS NULL 
	BEGIN
		SELECT @TotalEstimulo = 0
		 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @TotalEstimulo2 IS NULL 
	BEGIN
		SELECT @TotalEstimulo2 = 0
		INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
		(@idAgente, 33, 'Error al Cargar Estimulos Publicos para este Agente', GETDATE(), NULL, NULL, NULL, @CabeceraDeLiquidacion, 0)
	END

	IF @SituacionRevistaAnalizar IS NOT NULL
		DELETE FROM tb_MontosDeConceptosDelAgente WHERE Agente = @idAgente AND Mes = @Mes AND Anio = @Anio

	INSERT INTO tb_MontosDeConceptosDelAgente SELECT @idAgente, @TotalEstimulo, GETDATE(), 33, @Mes, @Anio
	INSERT INTO tb_MontosDeConceptosDelAgente SELECT @idAgente, @TotalEstimulo2, GETDATE(), 36, @Mes, @Anio

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0, @TotalEstimuloEstado=0, @TotalEstimuloEstado2 = 0, @SaldoEstimulo = 0, @SaldoEstimulo2 = 0
	
	CLOSE Servicios
	DEALLOCATE Servicios
	
	FETCH NEXT FROM Agentes INTO @IdAgente

	SELECT @TotalEstimulo = 0, @TotalEstimulo2 = 0, @TotalEstimuloEstado=0, @TotalEstimuloEstado2 = 0, @SaldoEstimulo = 0, @SaldoEstimulo2 = 0
END

CLOSE Agentes
DEALLOCATE Agentes

*/
GO
